#include <QTECore/jasynchronization.h>
#include <QCoreApplication>
#include <QThread>

class A : public QObject
{
public:
	int func(int a) const
	{
		for(int i=0; i<3; i++)
		{
			qDebug() << "hello" << a;
			QThread::sleep(1);
		}
		return 15;
	}

public:
	void func2() const
	{
		qDebug() << "-----> A::func2";
	}
};

class B
{
public:
	void func0() const{}
	void func1(int) const{}
};

static void __attribute_used__ func()
{
	for(int i=0; i<3; i++)
	{
		qDebug() << "world";
		QThread::sleep(1);
	}
}

static void func1(A*)
{
	for(int i=0; i<6; i++)
	{
		qDebug() << "---------- 1";
		QThread::msleep(500);

//		if( i == 3 )
//			delete a;
	}
}

static int __attribute_used__ func2()
{
	return 10;
}

int main(int argc, char *argv[])
{
	QCoreApplication app(argc, argv);
	A *a = new A();
	const A *a1 = new A();

	QTE::JAsynchronization async;
	async.run(func);

	async.run(std::bind(&A::func, a, 13),
	/*a,*/ [](int i){
		qDebug() << "=====================" << i;
	});

	async.run(func, a1, &A::func2);

	async.run(std::bind(func1, a), a, &A::func2);
	async.run(func2, new B(), &B::func1);

	return app.exec();
}
